package com.zx.chatroomV2.web.privilege;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
 * 菜单权限验证，需要注入角色和资源的数据信息
 * @author stylewolf
 *
 */
public class PrivilegeFilter {
	
	//权限集合
	protected static Map<String, List<String>> roleUrlMap = new HashMap<String, List<String>>();
	//权限集合,暂时没有考虑的类的调用
	protected static Map<String, List<String>> roleMethodMap = new HashMap<String, List<String>>();
	//资源 键为id 值为url
	protected static Map<String, String> map = new HashMap<String, String>();
	/**
	 * 获取资源的服务
	 */
	private IResourceLoaderService resourceLoaderService;
	
	public IResourceLoaderService getResourceLoaderService() {
		return resourceLoaderService;
	}

	public void setResourceLoaderService(
			IResourceLoaderService resourceLoaderService) {
		this.resourceLoaderService = resourceLoaderService;
	}
	/**
	 * 获取用户角色的服务
	 */
	private IRoleLoaderService roleLoaderService;	

	public IRoleLoaderService getRoleLoaderService() {
		return roleLoaderService;
	}

	public void setRoleLoaderService(IRoleLoaderService roleLoaderService) {
		this.roleLoaderService = roleLoaderService;
	}

	/**
	 * 初始化资源数据
	 */
	public void init(){
		roleUrlMap.clear();
		map.clear();
		map = resourceLoaderService.findAllResource();
		roleUrlMap = resourceLoaderService.initRoleUrlMap(map);
	}
	
	/**
	 * 验证权限是否存在
	 * @param userRoles
	 * @param url
	 * @return
	 */
	public boolean isAuth(String userid,String url)
	{
		//不需要验证的url
		if(!needValid(url)){
			return true;
		}
		List<String> roleIds = roleLoaderService.findUserRoles(userid);
		for (String id : roleIds) {
			List<String> urls = roleUrlMap.get(id);
			if(urls==null){
				return false;
			}
			for (String string : urls) {
				if(url.indexOf(string)!=-1)
				{
					return true;
				}
			}
		}
		return false;
	}
	/**
	 * 资源是否需要验证，如果当前的url不在需要验证的范围，则不进行权限验证
	 * @param url
	 * @return
	 */
	public boolean needValid(String url)
	{
		for (Entry<String, String> r : map.entrySet()) {
			if(url.indexOf(r.getValue())!=-1)
			{
				return true;
			}
		}
		return false;
	}
}
